package model

import (
	"cabinet/pkg/global"
	"gorm.io/gorm"
	"time"
)

type LockerType string

const (
	Small  LockerType = "small"
	Medium LockerType = "medium"
	Large  LockerType = "large"
)

// Cabinet 寄存柜表
type Cabinet struct {
	gorm.Model
	Code          string        `json:"code" gorm:"unique;not null"`         // 柜子编号
	Location      string        `json:"location"`                            // 柜子位置
	Type          string        `json:"type" gorm:"type:varchar(10)"`        // 柜子类型：small-小格，medium-中格，large-大格
	Status        bool          `json:"status" gorm:"default:false"`         // 状态：false-空闲，true-已占用
	QRCode        string        `json:"qr_code"`                             // 取件二维码
	StorageTime   time.Time     `json:"storage_time"`                        // 存储时间
	RetrievalTime *time.Time    `json:"retrieval_time"`                      // 取出时间
	Duration      time.Duration `json:"duration"`                            // 使用时长
	IsMaintenance bool          `json:"is_maintenance" gorm:"default:false"` // 是否维护中
	LastCheckTime time.Time     `json:"last_check_time"`                     // 最后检查时间

}

// CabinetRecord 寄存记录表
type CabinetRecord struct {
	ID          uint      `json:"id" gorm:"primaryKey"`
	CabinetID   uint      `json:"cabinet_id"` // 关联的柜子ID
	Cabinet     Cabinet   `json:"cabinet" gorm:"foreignKey:CabinetID"`
	PhoneNumber string    `json:"phone_number"`            // 用户手机号
	Status      int       `json:"status" gorm:"default:0"` // 状态：0-存储中，1-已取出，2-超时未取
	StoreTime   time.Time `json:"store_time"`              // 存储时间
	PickupTime  time.Time `json:"pickup_time,omitempty"`   // 取出时间
	ExpireTime  time.Time `json:"expire_time"`             // 过期时间

}

// CabinetMaintenance 柜子维护记录表
type CabinetMaintenance struct {
	ID          uint      `json:"id" gorm:"primaryKey"`
	CabinetID   uint      `json:"cabinet_id"` // 关联的柜子ID
	Cabinet     Cabinet   `json:"cabinet" gorm:"foreignKey:CabinetID"`
	Type        string    `json:"type"`                    // 维护类型：repair-维修，clean-清洁，inspect-检查
	Description string    `json:"description"`             // 维护描述
	StartTime   time.Time `json:"start_time"`              // 开始时间
	EndTime     time.Time `json:"end_time"`                // 结束时间
	Status      int       `json:"status" gorm:"default:0"` // 状态：0-进行中，1-已完成，2-已取消
	Operator    string    `json:"operator"`                // 操作人
	
}

// CabinetError 柜子错误记录表
type CabinetError struct {
	ID          uint      `json:"id" gorm:"primaryKey"`
	CabinetID   uint      `json:"cabinet_id"` // 关联的柜子ID
	Cabinet     Cabinet   `json:"cabinet" gorm:"foreignKey:CabinetID"`
	Type        string    `json:"type"`                    // 错误类型：hardware-硬件错误，network-网络错误，system-系统错误
	Description string    `json:"description"`             // 错误描述
	Status      int       `json:"status" gorm:"default:0"` // 状态：0-未处理，1-处理中，2-已处理
	HandleTime  time.Time `json:"handle_time"`             // 处理时间
	Handler     string    `json:"handler"`                 // 处理人
	CreatedAt   time.Time `json:"created_at"`
	UpdatedAt   time.Time `json:"updated_at"`
}

// CabinetUsage 柜子使用统计表
type CabinetUsage struct {
	ID            uint          `json:"id" gorm:"primaryKey"`
	CabinetID     uint          `json:"cabinet_id"` // 关联的柜子ID
	Cabinet       Cabinet       `json:"cabinet" gorm:"foreignKey:CabinetID"`
	Date          time.Time     `json:"date"`           // 统计日期
	UsageCount    int           `json:"usage_count"`    // 使用次数
	TotalDuration time.Duration `json:"total_duration"` // 总使用时长
	CreatedAt     time.Time     `json:"created_at"`
	UpdatedAt     time.Time     `json:"updated_at"`
}

// StorageRequest 存物请求参数
type StorageRequest struct {
	PhoneNumber string `json:"phone_number" binding:"required"` // 手机号
}

// StorageResponse 存物响应参数
type StorageResponse struct {
	Message       string `json:"message"`        // 响应消息
	QRCode        string `json:"qr_code"`        // 取件二维码
	CabinetNumber string `json:"cabinet_number"` // 柜子编号
}

// PickupRequest 取物请求参数
type PickupRequest struct {
	QRCode string `json:"qr_code" binding:"required"` // 取件二维码
}

// PickupResponse 取物响应参数
type PickupResponse struct {
	Message       string        `json:"message"`        // 响应消息
	CabinetNumber string        `json:"cabinet_number"` // 柜子编号
	Duration      time.Duration `json:"duration"`       // 使用时长
}

// 寄存柜的寄存操作详情
type StorageRecord struct {
	gorm.Model
	LockerID  int
	UserID    uint
	StartTime time.Time
	EndTime   time.Time
	Duration  time.Duration //寄存的总时长
	TotalCost float64       //寄存物品的总费用
	Refund    float64       //退款金额
}

func GetCabinetRecordTable() *gorm.DB {
	return global.Mysql.Model(&Cabinet{})
}
